在 .NET 專案中使用 Microsoft.Office.Interop.Excel 的常見問題
TLDR
dotnet publish不支援ResolveComReference,建議將 Excel 轉檔功能獨立為 .NET Framework Web API 服務。- 遇到
0x80070005存取被拒錯誤,需透過dcomcnfg設定 DCOM 權限,授予 IIS 應用程式集區帳戶存取權。 - 若發生找不到 Excel 檔案的錯誤,需在系統路徑下手動建立
Desktop資料夾以供 COM 元件存取。 - 此方案僅限 Windows 環境,且伺服器必須安裝 Microsoft Office。
dotnet publish 編譯異常
什麼情況下會遇到這個問題:在 .NET Core 或 .NET 5+ 專案中使用 dotnet publish 指令編譯包含 COM 元件參考的程式碼時。
由於 dotnet publish 使用的是 .NET SDK 內建的 MSBuild,其並不支援 ResolveComReference 工作,導致編譯失敗並出現錯誤訊息:error MSB4803: MSBuild 的 .NET Core 版本不支援工作 "ResolveComReference"。請使用 MSBuild 的 .NET Framework 版本。
- 解決建議:將 Excel 轉檔邏輯抽離,建立一個獨立的 .NET Framework Web API 專案來處理轉換工作,主程式再透過呼叫該 API 進行處理。
執行時的錯誤處理流程
1. DCOM 元件權限不足
什麼情況下會遇到這個問題:當 IIS 應用程式嘗試啟動 Excel COM 物件,但應用程式集區帳戶缺乏足夠的 DCOM 存取權限時。
若出現 System.UnauthorizedAccessException: Retrieving the COM class factory... 80070005 存取被拒,請依下列步驟進行設定:
- 開啟 DCOM 設定工具:按下 Windows + R,輸入
dcomcnfg。 - 導覽至:元件服務 > 電腦 > 我的電腦 > DCOM 設定。
- 找到 "Microsoft Excel Application",按右鍵選擇「內容」。
- 切換至「安全性」頁籤,在「存取權限」區塊點選「自訂」。
- 將對應的
IIS APPPOOL\{應用程式集區名稱}加入使用者清單。 - 勾選「本機存取」與「遠端存取」權限。
2. Excel 檔案存取問題
什麼情況下會遇到這個問題:在 Windows Server 環境中,Excel COM 元件啟動時會嘗試存取系統帳戶的 Desktop 資料夾,但該資料夾預設不存在。
若程式執行時回報找不到 Excel 相關檔案,請根據安裝的 Office 位元數,在對應路徑手動建立 Desktop 資料夾:
- 32 位元 Office:
C:\Windows\SysWOW64\config\systemprofile\Desktop - 64 位元 Office:
C:\Windows\System32\config\systemprofile\Desktop
注意事項
- 此設定僅適用於 Windows 環境。
- 伺服器必須安裝 Microsoft Office 軟體。
- 每次 Windows 更新後,建議重新檢查上述權限與資料夾設定。
異動歷程
- 2024-10-21 初版文件建立。
